package com.chinatelecom.tool;

import com.google.common.collect.Maps;
import lombok.extern.slf4j.Slf4j;

import java.sql.*;
import java.util.HashMap;
import java.util.Map;

@Slf4j
public class MetaDataTest {

    /**
     * 获取达梦数据库连接
     * */
    public Connection getConnection() {
        try {
            Class.forName("dm.jdbc.driver.DmDriver");
        } catch (ClassNotFoundException e) {
           log.error("注册驱动出错", e);
        }
        log.info("1.注册驱动成功，driver=dm.jdbc.driver.DmDriver");

        try {
            Connection connection = DriverManager.getConnection("jdbc:dm://localhost:5236", "PSY_USER",
                    "psy@Admin2013");
            log.info("2.建立连接成功，url=jdbc:dm://localhost:5236/PSY_USER");
            return connection;
        } catch (SQLException e) {
            log.error("获取达梦数据库连接出错", e);
        }
        return null;
    }

    /**
     * 测试查询
     * */
    public void testQuery(Connection connection) {
        try {
            String sql = "select * from sys_param_type";
            Statement statement = connection.createStatement();
            statement.execute(sql);
            log.info("3.执行查询成功，sql=select * from sys_param_type");

            ResultSet rs = statement.getResultSet();
            log.info("4.获取结果集成功，ResultSet={}", rs);

            statement.close();
            rs.close();
        } catch (SQLException e) {
            log.error("获取达梦数据库连接出错", e);
        }
    }

    /**
     * 获取数据库表和表注释
     * TABLE_CAT String => 表目录（可能为空）
     * TABLE_SCHEM 字符串 => 表模式（可能为空）
     * TABLE_NAME 字符串 => 表名
     * TABLE_TYPE 字符串 => 表类型。 典型的类型有“TABLE”、“VIEW”、“SYSTEM TABLE”、“GLOBAL TEMPORARY”、“LOCAL TEMPORARY”、“ALIAS”、“SYNONYM”。
     * REMARKS String => 表上的解释性注释
     * TYPE_CAT String => 类型目录（可能为空）
     * TYPE_SCHEM String => 类型架构（可能为空）
     * TYPE_NAME String => 类型名称（可能为空）
     * SELF_REFERENCING_COL_NAME String => 类型表的指定“标识符”列的名称（可能为空）
     * REF_GENERATION String => 指定如何创建 SELF_REFERENCING_COL_NAME 中的值。 值为“SYSTEM”、“USER”、“DERIVED”。 （可能为空）
     * 最后一个参数 "TABLE", "VIEW", "SYSTEM TABLE", "GLOBAL TEMPORARY", "LOCAL TEMPORARY", "ALIAS",      "SYNONYM".
     * @throws SQLException SQLException
     */

    public void testTableMeta(Connection connection) {
        try{
            DatabaseMetaData databaseMetaData = connection.getMetaData();
            HashMap<String, String> map = Maps.newHashMap();
            ResultSet resultSet = databaseMetaData.getTables("PSY_USER", "PSY_USER", "%", new String[]{"TABLE"});
            while (resultSet.next()) {
                String tableName = resultSet.getString("TABLE_NAME");
                String remarks = resultSet.getString("REMARKS");
                map.put(tableName, remarks);
            }
            log.info("3.获取表结构信息成功，表结构：{}", map);
        }catch (Exception e){
            log.error("获取达梦数据库meta info出错", e);
        }

    }


    public static void main(String[] args) {
        MetaDataTest bean = new MetaDataTest();
        Connection connection = bean.getConnection();
        bean.testTableMeta(connection);
    }

}
